package main

import (
	"net/http"

	"gitee.com/youkelike/ziam/zauth"
	"gitee.com/youkelike/ziam/zauth/example/store"
	"gitee.com/youkelike/ziam/zcode/zcode"
	"gitee.com/youkelike/ziam/zerrors"
	"gitee.com/youkelike/ziam/zutils/response"
	"github.com/gin-gonic/gin"
)

func main() {
	gin.SetMode(gin.DebugMode)
	g := gin.New()

	jwtStrategy := zauth.NewJWTStrategy()
	// 先拿请求中的用户名密码登录，拿到用户信息，再用用户信息生成 jwt token，
	// 只会往 token.claims 中添加数据，
	// 生成的 jwt token 会包含在响应的 body、cookie 中，
	g.POST("/login", jwtStrategy.LoginHandler)
	// 登出，会删除 cookie 中的 jwt token
	g.POST("/logout", jwtStrategy.LogoutHandler)
	// 刷新 jwt token，会重新生成 jwt token，
	// 从请求中拿到原来的 jwt token，用它的 claims 数据来生成新的 jwt token，只修改过期时间，
	g.POST("/refresh", jwtStrategy.RefreshHandler)

	auto := zauth.NewAutoAuth()
	g.NoRoute(auto.AuthFunc(), func(c *gin.Context) {
		response.Write(c, zerrors.WithCode(zcode.ErrUnknown, "Page not found"), nil)
	})

	v1 := g.Group("/v1")
	{
		v1.Use(auto.AuthFunc())

		userv1 := v1.Group("/users")
		{
			userv1.GET(":name", getUserByName)
		}
	}

	server := http.Server{Addr: ":9000", Handler: g}
	server.ListenAndServe()

}

func getUserByName(c *gin.Context) {
	var user store.User
	c.JSON(http.StatusOK, user)
}
